////////////////////////////////////////////////////////////////
//
// EXECryptor 2.x IAT rebuilder by PE_Kill / REVENGE CREW v 1.9
// -------------------------------------------------------------
// Replace my values of iat_start and iat_end and run script! 
//
// =============================================================
// - HISTORY -
// =============================================================
// [ v 0.x-1.7 ]
// Private versions
//
// [ v 1.8 ]
// Public version
//
// [ v 1.9 ]
// ! Thanks pavka, for good BugReport
// * tracing became some slower, but is more stable.
// * little bugfixes in IAT reader.
// =============================================================
//
////////////////////////////////////////////////////////////////

 var _esp
 var iat_start
 var iat_end
 var iat_cur
 var addr
 var counter
 var flag
 var c_gpa
 var temp
 var gmh
 var ll
 var ibase
 var iend

//================================================
//  IAT
//================================================
 mov iat_start,00471FF8
 mov iat_end,00472EB4

//================================================
//    
//================================================

//================================================
//  ImageBase , ..    
//     
//================================================
 mov addr,eip
 and addr,FFFFF000
 add addr,1000
@get_base:
 sub addr,1000
 mov temp,[addr]
 and temp,0000FFFF
 cmp temp,00005A4D
 jne @get_base
//================================================
//    ImageSize,    
// ,   ...
//================================================
 mov ibase,addr
 mov temp,addr
 add temp,3C
 mov temp,[temp]
 add temp,ibase
 add temp,50
 mov iend,[temp]
 eval "ImageSize = {iend} ???"
 msgyn $RESULT
 cmp $RESULT,1
 je @run
 ask "Enter real ImageSize!"
 mov iend,$RESULT
@run:
 add iend,ibase
 

//================================================
//   ,   
//================================================
 gpa "GetModuleHandleA","kernel32.dll"
 mov gmh,$RESULT
 gpa "LoadLibraryA","kernel32.dll"
 mov ll,$RESULT
//////////////////////////////////////////////////
 mov _esp,esp
 mov iat_cur,iat_start
 sub iat_cur,4
 mov c_gpa,0		// Cryptor GetProcAddress 
//=================================================
//   IAT
//=================================================
@imprec:
 add iat_cur,4
 cmp iat_cur,iat_end 	// ?
 ja @end
 mov addr,[iat_cur]
 cmp addr,0		// ?
 je @imprec
 cmp addr,ibase
 jb @imprec
 cmp addr,iend
 ja @imprec

 mov esp,_esp		//  
 mov eip,addr		//   
 mov [esp],eip		//       
 mov counter,25		//  
 mov flag,0		//   
//==================================================
//     IAT
//==================================================
@chk_run:
 dec counter
 cmp counter,0		//   
 je @find_gpa		//    Cryptor gpa
 sti			//  
 mov temp,[eip] 	//    eip
 cmp flag,0		//     
 ja @chk_jnz
 and temp,0000FFFF 	//  OR EAX,EAX
 cmp temp,0000C009
 jne @chk_run		//   
 inc flag		// ,  
 jmp @chk_run		//    
@chk_jnz:
 and temp,0000FFFF 	//  JNZ xxxxxxxx
 cmp temp,0000850F
 jne @chk_run		//   
 mov !ZF,1 		//  ,  ,   IAT 

@find_gpa:
 cmp c_gpa,0		//     Cryptor GetProcAddress?
 jne @trace		//        
 bphws gmh,"x"		//     GetModuleHandleA
 bphws ll,"x"		//   LoadLibraryA
 ticnd "WORD [eip]==453Bh" // ,      
 bphwc ll		//    
 bphwc gmh
 cmp eip,gmh		//   GetModuleHandleA?
 jne @chk_ll		//   ...
 bp [esp]		//     
 run
 bc eip
 jmp @find_gpa		//     Cryptor GetProcAddress
@chk_ll:
 cmp eip,ll		//   GetModuleHandleA?
 jne @f_jnz		//   ...
 bp [esp]		//     
 run
 bc eip
 jmp @find_gpa		//     Cryptor GetProcAddress
//=================================================
//   jnz xxxxxxxx
//=================================================
@f_jnz:
 sti
 mov temp,[eip] // 659F850F
 and temp,0000FFFF
 cmp temp,0000850F
 jne @f_jnz
 mov !ZF,1		//  ,   Z  ,    
//==================================================
//       ADD EAX,DWORD PTR SS:[EBP-4]
//==================================================
 mov counter,2		
@f_add:
 sti
 mov temp,[eip] // 68FC4503
 and temp,00FFFFFF
 cmp temp,00FC4503
 jne @f_add
 sti
 dec counter
 cmp counter,0
 jne @f_add 
 mov c_gpa,eip		//      Cryptor GetProcAddress
 sub iat_cur,4		//    IAT   
 jmp @imprec		//     

//==================================================
//   ...
//==================================================
@trace:
 bphws c_gpa,"x"
 run
 bphwc c_gpa
 cmp eip,c_gpa
 jne @error
 mov [iat_cur],eax
 jmp @imprec
@end:
 msg "OK!" 
pause
ret

@error:
 msg "error!!!"
 pause
ret